home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 March / EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso / earcd / assembler / progasm1.lha / SORGENTI / LEZIONE3d.s < prev    next >
Text File  |  1994-10-30  |  9KB  |  270 lines

  1.  
  2. ; Lezione3d.s    BARRETTA CHE SALE E SCENDE FATTA COL MOVE&WAIT DEL COPPER
  3.  
  4. ;    In questo listato viene usata una label come FLAG, ossia come
  5. ;    segnalazione per indicare se la barretta deve andare in alto
  6. ;    o in basso. Analizzate attentamente come funziona questo
  7. ;    programma, e' il primo del corso che puo' presentare problemi
  8. ;    a livello di ciclo condizionato.
  9.  
  10.  
  11.     SECTION    CiriCop,CODE    ; anche in Fast va bene
  12.  
  13. Inizio:
  14.     move.l    4.w,a6        ; Execbase in a6
  15.     jsr    -$78(a6)    ; Disable - ferma il multitasking
  16.     lea    GfxName(PC),a1    ; Indirizzo del nome della lib da aprire in a1
  17.     jsr    -$198(a6)    ; OpenLibrary, routine della EXEC che apre
  18.                 ; le librerie, e da in uscita l'indirizzo
  19.                 ; di base di quella libreria da cui fare le
  20.                 ; distanze di indirizzamento (Offset)
  21.     move.l    d0,GfxBase    ; salvo l'indirizzo base GFX in GfxBase
  22.     move.l    d0,a6
  23.     move.l    $26(a6),OldCop    ; salviamo l'indirizzo della copperlist
  24.                 ; di sistema
  25.     move.l    #COPPERLIST,$dff080    ; COP1LC - Puntiamo la nostra COP
  26.     move.w    d0,$dff088        ; COPJMP1 - Facciamo partire la COP
  27. mouse:
  28.     cmpi.b    #$ff,$dff006    ; VHPOSR - Siamo alla linea 255?
  29.     bne.s    mouse        ; Se non ancora, non andare avanti
  30.  
  31.     bsr.s    MuoviCopper    ; Una routine che fa scendere e salire la barra
  32.  
  33. Aspetta:
  34.     cmpi.b    #$ff,$dff006    ; VHPOSR - Siamo alla linea 255?
  35.     beq.s    Aspetta        ; Se si, non andare avanti, aspetta la linea
  36.                 ; seguente, altrimenti MuoviCopper viene
  37.                 ; rieseguito
  38.  
  39.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  40.     bne.s    mouse        ; se no, torna a mouse:
  41.  
  42.     move.l    OldCop(PC),$dff080    ; COP1LC - Puntiamo la cop di sistema
  43.     move.w    d0,$dff088        ; COPJMP1 - facciamo partire la cop
  44.  
  45.     move.l    4.w,a6
  46.     jsr    -$7e(a6)    ; Enable - riabilita il Multitasking
  47.     move.l    gfxbase(PC),a1    ; Base della libreria da chiudere
  48.                 ; (vanno aperte e chiuse le librerie!!!)
  49.     jsr    -$19e(a6)    ; Closelibrary - chiudo la graphics lib
  50.     rts
  51.  
  52. ;
  53. ;
  54. ;
  55. ;
  56.  
  57.  
  58. MuoviCopper:
  59.     LEA    BARRA,a0
  60.     TST.B    SuGiu        ; Dobbiamo salire o scendere? se SuGiu e'
  61.                 ; azzerata, (cioe' il TST verifica il BEQ)
  62.                 ; allora saltiamo a VAIGIU, se invece e' a $FF
  63.                 ; (se cioe' questo TST non e' verificato)
  64.                 ; continuiamo salendo (facendo dei subq)
  65.     beq.w    VAIGIU
  66.     cmpi.b    #$82,8*9(a0)    ; siamo arrivati alla linea $82?
  67.     beq.s    MettiGiu    ; se si, siamo in cima e dobbiamo scendere
  68.     subq.b    #1,(a0)
  69.     subq.b    #1,8(a0)    ; ora cambiamo gli altri wait: la distanza
  70.     subq.b    #1,8*2(a0)    ; tra un wait e l'altro e' di 8 bytes
  71.     subq.b    #1,8*3(a0)
  72.     subq.b    #1,8*4(a0)
  73.     subq.b    #1,8*5(a0)
  74.     subq.b    #1,8*6(a0)
  75.     subq.b    #1,8*7(a0)    ; qua dobbiamo modificare tutti i 9 wait della
  76.     subq.b    #1,8*8(a0)    ; barra rossa ogni volta per farla salire!
  77.     subq.b    #1,8*9(a0)
  78.     rts
  79.  
  80. MettiGiu:
  81.     clr.b    SuGiu        ; Azzerando SuGiu, al TST.B SuGiu il BEQ
  82.     rts            ; fara' saltare alla routine VAIGIU, e
  83.                 ; la barra scedera'
  84.  
  85. VAIGIU:
  86.     cmpi.b    #$fc,8*9(a0)    ; siamo arrivati alla linea $fc?
  87.     beq.s    MettiSu        ; se si, siamo in fondo e dobbiamo risalire
  88.     addq.b    #1,(a0)
  89.     addq.b    #1,8(a0)    ; ora cambiamo gli altri wait: la distanza
  90.     addq.b    #1,8*2(a0)    ; tra un wait e l'altro e' di 8 bytes
  91.     addq.b    #1,8*3(a0)
  92.     addq.b    #1,8*4(a0)
  93.     addq.b    #1,8*5(a0)
  94.     addq.b    #1,8*6(a0)
  95.     addq.b    #1,8*7(a0)    ; qua dobbiamo modificare tutti i 9 wait della
  96.     addq.b    #1,8*8(a0)    ; barra rossa ogni volta per farla scendere!
  97.     addq.b    #1,8*9(a0)
  98.     rts
  99.  
  100. MettiSu:
  101.     move.b    #$ff,SuGiu    ; Quando la label SuGiu non e' a zero,
  102.     rts            ; significa che dobbiamo risalire.
  103.  
  104.  
  105. ;    Questo byte, indicato dalla label SuGiu, e' un FLAG, ossia una
  106. ;    bandierina (in gergo), infatti una volta e'a  $ff e un'altra e' a
  107. ;    $00, a seconda della direzione da seguire (su o giu'!). E' appunto
  108. ;    come una bandierina, che quando e' abbassata ($00) indica che dobbiamo
  109. ;    scendere e quando e' alzata ($FF) dobbiamo salire. Viene infatti
  110. ;    eseguita una comparazione della linea raggiunta per verificare se
  111. ;    siamo arrivati in cima o in fondo, e se ci siamo arrivati cambiamo
  112. ;    la direzione (con clr.b SuGiu o move.b #$ff,Sugiu)
  113.  
  114. SuGiu:
  115.     dc.b    0,0
  116.  
  117. GfxName:
  118.     dc.b    "graphics.library",0,0    
  119.  
  120. GfxBase:        ; Qua ci va l'indirizzo di base per gli Offset
  121.     dc.l    0    ; della graphics.library
  122.  
  123. OldCop:            ; Qua ci va l'indirizzo della vecchia COP di sistema
  124.     dc.l    0
  125.  
  126.     SECTION    GRAPHIC,DATA_C    ; Questo comando fa caricare dal sistema
  127.                 ; operativo questo segmento di dati
  128.                 ; in CHIP RAM, obbligatoriamente
  129.                 ; Le copperlist DEVONO essere in CHIP RAM!
  130.  
  131. COPPERLIST:
  132.     dc.w    $100,$200    ; BPLCON0
  133.     dc.w    $180,$000    ; COLOR0 - Inizio la cop col colore NERO
  134.     dc.w    $4907,$FFFE    ; WAIT - Aspetto la linea $49 (73)
  135.     dc.w    $180,$001    ; COLOR0 - blu scurissimo
  136.     dc.w    $4a07,$FFFE    ; WAIT - linea 74 ($4a)
  137.     dc.w    $180,$002    ; blu un po' piu' intenso
  138.     dc.w    $4b07,$FFFE    ; linea 75 ($4b)
  139.     dc.w    $180,$003    ; blu piu' chiaro
  140.     dc.w    $4c07,$FFFE    ; prossima linea
  141.     dc.w    $180,$004    ; blu piu' chiaro
  142.     dc.w    $4d07,$FFFE    ; prossima linea
  143.     dc.w    $180,$005    ; blu piu' chiaro
  144.     dc.w    $4e07,$FFFE    ; prossima linea
  145.     dc.w    $180,$006    ; blu a 6
  146.     dc.w    $5007,$FFFE    ; salto 2 linee: da $4e a $50, ossia da 78 a 80
  147.     dc.w    $180,$007    ; blu a 7
  148.     dc.w    $5207,$FFFE    ; sato 2 linee
  149.     dc.w    $180,$008    ; blu a 8
  150.     dc.w    $5507,$FFFE    ; salto 3 linee
  151.     dc.w    $180,$009    ; blu a 9
  152.     dc.w    $5807,$FFFE    ; salto 3 linee
  153.     dc.w    $180,$00a    ; blu a 10
  154.     dc.w    $5b07,$FFFE    ; salto 3 linee
  155.     dc.w    $180,$00b    ; blu a 11
  156.     dc.w    $5e07,$FFFE    ; salto 3 linee
  157.     dc.w    $180,$00c    ; blu a 12
  158.     dc.w    $6207,$FFFE    ; salto 4 linee
  159.     dc.w    $180,$00d    ; blu a 13
  160.     dc.w    $6707,$FFFE    ; salto 5 linee
  161.     dc.w    $180,$00e    ; blu a 14
  162.     dc.w    $6d07,$FFFE    ; salto 6 linee
  163.     dc.w    $180,$00f    ; blu a 15
  164.     dc.w    $780f,$FFFE    ; linea $78
  165.     dc.w    $180,$000    ; colore NERO
  166.  
  167. BARRA:
  168.     dc.w    $7907,$FFFE    ; aspetto la linea $79
  169.     dc.w    $180,$300    ; inizio la barra rossa: rosso a 3
  170.     dc.w    $7a07,$FFFE    ; linea seguente
  171.     dc.w    $180,$600    ; rosso a 6
  172.     dc.w    $7b07,$FFFE
  173.     dc.w    $180,$900    ; rosso a 9
  174.     dc.w    $7c07,$FFFE
  175.     dc.w    $180,$c00    ; rosso a 12
  176.     dc.w    $7d07,$FFFE
  177.     dc.w    $180,$f00    ; rosso a 15 (al massimo)
  178.     dc.w    $7e07,$FFFE
  179.     dc.w    $180,$c00    ; rosso a 12
  180.     dc.w    $7f07,$FFFE
  181.     dc.w    $180,$900    ; rosso a 9
  182.     dc.w    $8007,$FFFE
  183.     dc.w    $180,$600    ; rosso a 6
  184.     dc.w    $8107,$FFFE
  185.     dc.w    $180,$300    ; rosso a 3
  186.     dc.w    $8207,$FFFE
  187.     dc.w    $180,$000    ; colore NERO
  188.  
  189.     dc.w    $fd07,$FFFE    ; aspetto la linea $FD
  190.     dc.w    $180,$00a    ; blu intensita' 10
  191.     dc.w    $fe07,$FFFE    ; linea seguente
  192.     dc.w    $180,$00f    ; blu intensita' massima (15)
  193.     dc.w    $FFFF,$FFFE    ; FINE DELLA COPPERLIST
  194.  
  195.  
  196.     end
  197.  
  198. Ora la barra se ne va su e giu', tramite l'utilizzo di una label che segna
  199. se stiamo salendo o scendendo: se la label SuGiu e' azzerata vengono eseguite
  200. le istruzioni che fanno scendere la barra, se invece non e' a zero vengono
  201. eseguite le istruzioni che la fanno risalire. All'inizio la label e' a zero,
  202. quindi vengono eseguiti gli ADDQ che la fanno scendere, fino a che, una
  203. volta raggiunto il fondo, la label SuGiu viene scritta con un $FF, quindi
  204. nei cicli seguenti, quando viene fatto il TST.b SuGiu, viene eseguita invece la
  205. serie di SUBQ che la fanno risalire, fino a che non arriva in cima, a quel
  206. punto la label SuGiu viene nuovamente azzerata, quindi vengono eseguiti
  207. nuovamente gli ADDQ che la fanno scendere, eccetera.
  208. Con questa routine si possono verificare bene gli effetti delle modifiche:
  209. Provate a mettere un ; alle istruzioni che aspettano la linea $FF col $dff006:
  210.  
  211. mouse:
  212.     cmpi.b    #$ff,$dff006    ; VHPOSR
  213. ;    bne.s    mouse        ; Se non ancora, non andare avanti
  214.  
  215.     bsr.s    MuoviCopper
  216.  
  217. Aspetta:
  218.     cmpi.b    #$ff,$dff006    ; VHPOSR
  219. ;    beq.s    Aspetta    
  220.  
  221.  
  222. In questo modo perdiamo la sincronizzazione col video, e la barretta va
  223. all'impazzata, provate ad eseguirlo cosi'!!! Come avrete notato, non si
  224. fa nemmeno in tempo a vedere il suo movimento! Specialmente se avete un
  225. Amiga 1200 o comunque un computer piu' veloce.
  226. Ora invece faremo andare piu' piano la barretta eseguendola 1 volta ogni
  227. 2 fotogrammi anziche' 1 volta per fotogramma: fate questa modifica:
  228. (Togliete anche il loop "Aspetta:")
  229.  
  230. mouse:
  231.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  232. ;    bne.s    mouse        ; Se non ancora, non andare avanti
  233.  
  234. frame:
  235.     cmpi.b    #$fe,$dff006    ; Siamo alla linea 254? (deve rifare il giro!)
  236.     bne.s    frame        ; Se non ancora, non andare avanti
  237.  
  238.     bsr.s    MuoviCopper
  239.  
  240. ;Aspetta:    ; tolto, non c'e' piu' rischio...
  241. ;    cmpi.b    #$ff,$dff006
  242. ;    beq.s    Aspetta    
  243.  
  244. In questo caso vengono persi 2 fotogrammi di tempo, infatti quando il pennello
  245. elettronico arriva alla linea $ff, ossia 255, viene passato il primo loop,
  246. e si entra nel loop frame:, che attende che arrivi alla linea 254!!!! per
  247. arrivarci pero' deve arrivare in fondo, ripartire da capo e arrivare a 254,
  248. quindi in totale si aspettano 2 fotogrammi, ossia 2 spennellate complete.
  249. Infatti eseguendo il listato cosi' modificato si nota che la velocita' e'
  250. dimezzata. Per farlo andare ancora piu' piano, si possono perdere 3 fotogrammi:
  251.  
  252. mouse:
  253.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  254.     bne.s    mouse        ; Se non ancora, non andare avanti
  255. frame:
  256.     cmpi.b    #$fe,$dff006    ; Siamo alla linea 254? (deve rifare il giro!)
  257.     bne.s    frame        ; Se non ancora, non andare avanti
  258. frame2:
  259.     cmpi.b    #$fd,$dff006    ; Siamo alla linea 253? (deve rifare il giro!)
  260.     bne.s    frame2        ; Se non ancora, non andare avanti
  261.     bsr.s    MuoviCopper
  262.     ...
  263.  
  264. Con lo stesso metodo, questa volta arrivati alla linea 254 gli chiediamo
  265. di arrivare alla linea 253, il che costa un altro intero fotogramma.
  266.  
  267. Per verificare a che linea siete arrivati, quando uscite premendo il MOUSE
  268. provate a fare "M BARRA", e vedrete l'ultimo valore che aveva il WAIT.
  269.  
  270.